package com.elitedatai.mchtest.flyer.repository;

import com.elitedatai.mchtest.flyer.model.entity.Flyer;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

/**
 * 飞手数据访问层接口
 * 提供飞手实体的数据库操作方法
 */
public interface FlyerRepository extends JpaRepository<Flyer, Long> {

    /**
     * 根据飞手ID查找飞手
     * @param flyerId 飞手ID
     * @return 飞手实体
     */
    Optional<Flyer> findByFlyerId(String flyerId);

    /**
     * 根据飞手姓名查找飞手
     * @param flyerName 飞手姓名
     * @return 飞手实体列表
     */
    List<Flyer> findByFlyerName(String flyerName);

    /**
     * 根据状态查找飞手
     * @param status 状态
     * @return 飞手实体列表
     */
    List<Flyer> findByStatus(Integer status);

    /**
     * 根据电话号码查找飞手
     * @param phone 电话号码
     * @return 飞手实体
     */
    Optional<Flyer> findByPhone(String phone);

    /**
     * 根据邮箱查找飞手
     * @param email 邮箱
     * @return 飞手实体
     */
    Optional<Flyer> findByEmail(String email);

    /**
     * 根据资质类型查找飞手
     * @param qualificationType 资质类型
     * @return 飞手实体列表
     */
    List<Flyer> findByQualificationType(String qualificationType);

    /**
     * 根据认证等级查找飞手
     * @param certificationLevel 认证等级
     * @return 飞手实体列表
     */
    List<Flyer> findByCertificationLevel(String certificationLevel);

    /**
     * 根据飞手ID删除飞手
     * @param flyerId 飞手ID
     */
    void deleteByFlyerId(String flyerId);

    /**
     * 检查飞手ID是否存在
     * @param flyerId 飞手ID
     * @return 是否存在
     */
    boolean existsByFlyerId(String flyerId);

    /**
     * 检查电话号码是否存在
     * @param phone 电话号码
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 检查邮箱是否存在
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 根据多个条件动态查询飞手信息
     * @param flyerId 飞手ID
     * @param flyerName 飞手姓名
     * @param status 状态
     * @param qualificationType 资质类型
     * @param certificationLevel 认证等级
     * @return 飞手实体列表
     */
    @Query("SELECT f FROM Flyer f WHERE " +
            "(:flyerId IS NULL OR f.flyerId = :flyerId) AND " +
            "(:flyerName IS NULL OR f.flyerName LIKE %:flyerName%) AND " +
            "(:status IS NULL OR f.status = :status) AND " +
            "(:qualificationType IS NULL OR f.qualificationType = :qualificationType) AND " +
            "(:certificationLevel IS NULL OR f.certificationLevel = :certificationLevel)")
    List<Flyer> findFlyersByMultipleConditions(
            @Param("flyerId") String flyerId,
            @Param("flyerName") String flyerName,
            @Param("status") Integer status,
            @Param("qualificationType") String qualificationType,
            @Param("certificationLevel") String certificationLevel);

    /**
     * 分页查询所有飞手，按创建时间降序排列
     * @param pageable 分页参数
     * @return 分页结果
     */
    @Query("SELECT f FROM Flyer f ORDER BY f.createTime DESC")
    Page<Flyer> findAllOrderByCreateTimeDesc(Pageable pageable);

    /**
     * 根据状态分页查询飞手
     * @param status 状态
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<Flyer> findByStatusOrderByCreateTimeDesc(Integer status, Pageable pageable);
}